package com.mfnote.view.chatemoji;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.mfnote.view.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.Log;

/**
 * 表情转化工具
 * @author ZHF
 *
 */
public class FaceConversionUtil {

	//每一页的表情个数
	private int pageSize = 20;
	private static FaceConversionUtil mFaceConversionUtil;

	//保存于内存中的表情HashMap
	private HashMap<String, String> emojiMap = new HashMap<String, String>();
	//表情分页的结果集合
	private List<ChatEmoji> emojis = new ArrayList<ChatEmoji>();
	//表情分页的结果集合
	public List<List<ChatEmoji>> emojiLists = new ArrayList<List<ChatEmoji>>();

	/**实例化：单例**/
	public static FaceConversionUtil getInstance() {
		if(mFaceConversionUtil == null) {
			mFaceConversionUtil = new FaceConversionUtil();
		}
		return mFaceConversionUtil;
	}
	
	/**得到一个SpannableString对象,通过传入的字符串，并进行正则判断**/
	public SpannableString getExpressionString(Context context, String str) {
		SpannableString spannableString = new SpannableString(str);
		// 正则表达式比配字符串里是否含有表情，如： 我好[开心]啊         编辑框内的数据[可爱][笑脸]
		String zhengze = "\\[[^\\]]+\\]";
		Pattern pattern = Pattern.compile(zhengze,Pattern.CASE_INSENSITIVE); //大小写敏感
		try {
			dealExpression(context, spannableString, pattern, 0);
		} catch (Exception e) {
			Log.e("dealExpression", e.getMessage());
		}
		return spannableString;
	}
	
	/**对spanableString进行正则判断，如果符合要求，则以表情图片代替**/
	private void dealExpression(Context context, SpannableString spannableString,Pattern pattern,int start) {
		//匹配器
		Matcher matcher = pattern.matcher(spannableString);
		while(matcher.find()) {
			String key = matcher.group(); //得到匹配的字符串
			// 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
			if(matcher.start() < start) {
				continue; //跳出当前，回到外层循环开始位置
			}
			String value = emojiMap.get(key);
			if(TextUtils.isEmpty(value)) {
				continue;
			}
			
			// 通过上面匹配得到的字符串来生成图片资源id
			int resId = context.getResources().getIdentifier(value, "drawable", context.getPackageName());
			
			if(resId != 0) {
				Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),resId);
				bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true);//创建一张可以缩放的位图
				//通过图片资源的id得到bitmap,用一个ImageSpan来包装
				ImageSpan imageSpan = new ImageSpan(bitmap);
				//计算该图片名字的长度，也就是要替换的字符串的长度
				int end = matcher.start() + key.length();
				//将该图片替换字符串中规定的位置中
				spannableString.setSpan(imageSpan, matcher.start(), end, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
				
				if(end < spannableString.length()) {
					//如果整个字符串还未验证完，则继续。。
					dealExpression(context, spannableString, pattern, end);
				}
				break;
			}
			
		}
	}
	
	/**添加表情**/
	public SpannableString addFace(Context context, int imgId, String spannableString) {
		if(TextUtils.isEmpty(spannableString)) {
			return null;
		}
		
		Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),imgId);
		bitmap = Bitmap.createScaledBitmap(bitmap, 35, 35, true);
		ImageSpan imageSpan = new ImageSpan(context,bitmap);
		
		SpannableString spannable = new SpannableString(spannableString);
		spannable.setSpan(imageSpan, 0, spannableString.length(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
		
		return spannable;
	}
	
	/**获取文件文本**/
	public void getFileText(Context context) {
		ParseData(FileUtils.getEmojiFile(context), context);
	}
	
	/**解析字符 eg:"emoji_1.png,[可爱]","emoji_2.png,[笑脸]"**/
	private void ParseData(List<String> data, Context context) {
		emojiLists.clear();
		
		if(data == null) {
			return;
		}
		ChatEmoji emojEentry;
		try {
			for(String str : data) {
				String[] text = str.split(",");
				String fileName = text[0].substring(0, text[0].lastIndexOf("."));
				emojiMap.put(text[1], fileName);  //{[可爱]=emoji_1}
				//根据资源名称获取其ID
				int resID = context.getResources().getIdentifier(fileName,"drawable",context.getPackageName());
				if(resID != 0) {
					emojEentry = new ChatEmoji();
					emojEentry.setId(resID);
					emojEentry.setCharacter(text[1]);
					emojEentry.setFaceName(fileName);
					emojis.add(emojEentry);   //List<ChatEmoji>表情分页的结果集合
				}
			}
			//向上取整（一页20个 + 1最后一个删除）
			int pageCount = (int) Math.ceil(emojis.size() / 20 + 0.1);
			for (int i = 0; i < pageCount; i++) {
				//表情分页的结果集合
				emojiLists.add(getData(i)); //将分页获取到的数据加载到
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**获取分页数据**/
	private List<ChatEmoji> getData(int page) {
		int startIndex = page * pageSize; //1*20, 2*20
		int endIndex = startIndex + pageSize; //20 + 20
		
		if(endIndex > emojis.size()) {
			endIndex = emojis.size();
		}
		
		// 不这么写，会在viewpager加载中报集合操作异常，我也不知道为什么
		List<ChatEmoji> list = new ArrayList<ChatEmoji>();
		list.addAll(emojis.subList(startIndex, endIndex));  //subList截取集合中指定位置的数据段		
		//不够一页的表情
		if(list.size() < pageSize) {
			for (int i = list.size(); i < pageSize; i++) {
				ChatEmoji chatEmoji = new ChatEmoji();
				list.add(chatEmoji);
			}
		}
		if(list.size() == pageSize) {
			ChatEmoji object = new ChatEmoji();
			object.setId(R.drawable.face_del_icon);
			list.add(object);
		}
		return list;
	}
	
}
